■文章編5      ┏━━━━━━━━━━━━━━━━━━━━━━━━┓      ┃ ┃      ┃ アセンブラの道 ┃      ┃ ┃      ┗━━━━━━━━━━━━━━━━━━━━━━━━┛ ■アセンブラ あるひどく暑い日の,午後。 隣に座っていた友人が静かに「それ,取って」と言うので,僕は躊躇なく手 元のフロッピィディスクを手に取って彼に渡しました。なんということのない, 日常の光景。しかし,・・・・。 上のやり取り,少し考えてみると,現在最高峰のスーパーコンピュータの機 能に比べてみても実はたいへん高度なものなのですが,おわかりいただけるで しょうか。 というのは・・・・コンピュータは,こういった自然言語の処理がたいへん苦手 なのです。「それ,取って」という,ごくシンプルな言葉の裏には,「僕より は君に近いところにあるいくつかのもののうち,僕に必要なとある何かを選び, 僕の手元まで運んでほしい」,というけっこう複雑な意図が込められているわ けですし,僕はその「何か」を「彼が今まさに必要としているものは,このや っとキャッチできたぷよ人形でもなければ,買ってきたばかりの「ターちゃん (17)」でもなく,ましてやあの教授の新譜CDでもなさそうなので,どうやら このフロッピィディスクらしい」と認識したわけです。なかなか人間的でしょ う? さて,コンピュータの内部処理が,CPUやメモリ(ROM,RAM)の間 を2進数のデータがやり取りされることで進められていることはもうご存じで すね。ノイマン型とよばれる現在のコンピュータは,すべて,1つ残らず,電 源のON,OFFを最も基本的な2進数のデータとみなして動作しています。 そして,その2進数の組み合わせで,たとえばシューティングゲームの敵キャ ラを表示したり,ワープロの文書ファイルを更新したり,ミサイルの着弾地点 を計算したりしているのです。そんなON,OFFの2値しか理解せず,ある 意味では全く融通の効かないディジタルコンピュータ君に「それ,取って」と 伝えるためには,いったいどうすればいいのでしょう。 実は,残念なことに,一番おおもとのところでは近道はありません。2進数 の組み合わせの山をプログラムやデータとして与え,2進数の組み合わせの山 を返してもらうしかないのです。 しかし,当たり前ですが,それではあまりに人間にとって可読性が悪く,プ ログラミングに要する時間が途方もないものになってしまうことは想像にかた くありません。また,そういった2進数の山でプログラムを構築できたり結果 を判別できたりできるのは,おそらく,よほど努力をした人か,もしくは特殊 な才能や感覚の持ち主で,世界は深刻なプログラマ不足,オペレータ不足に苦 しむことになるでしょう。 そこで,それを少しでも緩和するために考え出されたもの,いわば「人間と コンピュータの間の簡易翻訳機」にあたるプログラム,それが「アセンブラ」 でした。ただし,このアセンブラには,「それ,取って」などという高度な命 令をストレートに翻訳するほどの機能はありません。アセンブラは,コンピュ ータ(CPU)に理解できる最低単位の命令セットにほぼ「一対一」対応して おり,「それ,取って」にあたる命令をコンピュータに伝えるには,それこそ, 手を上げろ 次に手を右に動かすのだが 20cmを単位Aとする 手を動かすのは単位A分 手を下げろ フロッピィディスクを物体Xとする 物体Xをつかめ 次に手を上げるのだが 10cmを単位Bとする 手を上げるのは単位B分・・・・ といった具合に命令や数値を延々と記述していくしかないのです。 さて,アセンブラを使ってプログラムを作るのは,実際,大変な手間を要す るのですが(なにしろ,コンピュータが動作する手順すべてを人間が管理し, 記述してやる必要があるわけですから),もちろんメリットもなくはありませ ん。たとえば,コンピュータに密接に,かつ無駄なく命令を与えるため,プロ グラムが小さくてすみ,しかも極めて高速に動作するという利点があります。 また,ディスクや画面など,いわゆるI/O,周辺機器の操作をこと細かに行 えるのもアセンブラでプログラミングする際の特長です。 逆に,弱点はというと,たかだか百個余りの命令セットの組み合わせでプロ グラムを作るわけですから,プログラムが特殊技能的に難しい,という点があ ります(初心者にはなかなか手を出しかねる所以です)。また,個別のコンピ ュータの内部構造に密着したプログラムになるため,他機種ではそのプログラ ムを資源として流用しづらい(プログラムの移植が面倒),環境が対話的でな いためバグが発見しづらい,等の難点も見逃せません。 そこで開発されたのが,アセンブラよりもう少し人間寄りの,「高位言語」 とよばれるプログラミング言語たちです。 ■アセンブラ使用の手順 高位言語に触れる前に,アセンブラでプログラムを作るときの手順を簡単に 説明しておきましょう。 アセンブラでプログラムを組むときは,まず「ニーモニック」とよばれるア ルファベット3文字ばかりの命令群(JMPとかMOVとか)を普通のテキス トエディタで記述していきます。このニーモニックが,実は,CPUの命令セ ットに一対一対応しているのです。また,ニーモニックの右側には,「オペラ ンド(演算子)」といって,そのニーモニックの演算の対象となるレジスタや 数値を記述します。最近の高機能なアセンブラでは「ローカルラベル」だの 「マクロ」だの「ライブラリ機能」だのが付いているのが当たり前のようにな っていますが,それらまで全部説明していくときりがないので,ここではこの くらいにしましょう。 さて,上記のように書かれたテキスト,つまりプログラムの元を,「アセン ブラソース」といいます。さあ,用意も整いました,いよいよアセンブラを起 動しましょう。アセンブラには市販品,手作り品などさまざまありますが,動 作は一種のコンバータで,テキスト内に書かれたニーモニックやオペランドを CPUに読めるような数値の塊に変換してくれます。 それぞれの操作法にしたがってアセンブラを起動。アセンブラは,あなたの 書いたアセンブラソースを読み込み,ディスクやメモリ中に数字の塊(オブジ ェクト)を出力します。後は,このオブジェクトがそのマシンで実行できるよ うに適当に形を整えれば,めでたく実行ファイル(マシン語プログラム)がで き上がるわけです。 ここではものすご〜く大雑把な説明しかしませんでしたが,このような流れ を理解するだけでもアセンブラについての記事など,かなりわかりやすくなる はずです。 ■高位プログラミング言語 さて,次の話題へ移りましょう。 「高位言語」は「高級言語」とよばれることも多いようですが,僕は「高位言 語」とよぶことにしています。この場合の高低が等級ではなく,コンピュータ が直接理解できる命令セット(低)からどの程度人間の自然言語(高)に近い かによって語られるものだからです。ちなみにこの場合,コンピュータに最も 近いアセンブラが「最低位言語」となるわけですが,よく考えるとそっちが低 いのこっちが高いのと,コンピュータに対して失礼な発想ではありますね。 さて,高位言語では,アセンブラとは異なり,一般に フロッピィディスクを物体Xとする 物体Xを手に取れ 手に取った物体Xをここまで運べ くらいでコンピュータに命令を伝えられます。これならアセンブラに比べれば プログラミングが簡単そうですね。 さて,この高位言語の最大のメリットはいうまでもなく人間に理解しやすい 文法をもっていることでしょう。言語そのものの特性ではありませんが,対話 的な開発環境が整い,プログラミング,デバッギングが楽だというケースも少 なくありません。逆にデメリットは,直接ハードを制御するアセンブラに比べ るとどうしても無駄が多く,プログラムが大きくなることや,実行速度が遅い ことなどがあります。もっとも最近では,作成される実行プログラムの無駄や ぜい肉をはぶく機能(最適化,オプティマイズなどという)が強化され,小さ くて速いプログラムを作る工夫の進められた言語も少なくありません。 高位言語には,みなさんご存じの,初心者向けとして開発されたBASIC をはじめ,そのお父さんである科学技術計算の雄(というほど科学技術計算に 向いているとは思えない)FORTRAN,ビジネス界で顔の広い(同上)C OBOL,構造化言語(といわれてもいったいなんのことやら)のPascal , オブジェクト指向(といわれても・・・・以下同文)のSmalltalk,記号処理系の LISP,論理型言語のPROLOG(この2つは,後述の人工知能の研究に 多用されています),FORTH系のスタック処理系言語で日本語化が興味深 いMind などなどなどなど,実にさまざまなものがあります。また,当節もは や「流行」というよりは天下統一,征夷大将軍任官を果たした感のあるC言語 など,かつてはアセンブラに近い低位言語扱いを受けていたのが,最近では環 境やソフトウェア資産が豊かになり,しっかり高位言語顔をしています。 さらに,価格に対してコンピュータ本体や補助記憶装置のパワーが相対的に 高まりつつある昨今では,高位言語の次世代をになうものとして,YPS処理 系などのように画面上にプログラムの流れをレイアウト感覚で置いていくとC 言語のソースプログラムが出力されるといった,さらに人間の五感よりのイン タフェースをもつものや,ハイパーテキストのようにプログラミングを意識せ ずにグラフィックやテキストデータを配置していくことでプログラムやデータ 集を構築させていくようなものも現れ始めています。 ■人工知能 さて,冒頭の「それ,取って」の例には,プログラミング言語の種類や高位 ・低位等とは全く別の,大きな要素が含まれていたのですが,お気づきでしょ うか。それは「推理」「判断」の問題です。 コンピュータの世界では,アセンブラや各種高位言語を使い,いろいろな計 算や制御などが実現していることはご存じのとおりです。しかし,より人間の 脳の働きに近い「推理」や「判断」などについてはまだまだ研究,実用化は進 んでいません。 この「人工知能(artificial intelligence,AI)」の研究は,人間の脳 の働きを調べるために,コンピュータでシミュレートするという実験から始ま りました。これは,まだ始まったばかりの研究ジャンルで,数年前(「ファジ ィ」や「ニューロ」や「バーチャルリアリティ」の前,ということです)に車 や電気製品の宣伝文句に「AI,AI」とにぎやかにもてはやされたときでも, そのプログラムの実体は もし〜なら・・・・する でもって それでも もし〜なら・・・・する というIF〜THENルールの組み合わせ程度のものでしかありませんでした。 人工知能については,説明していくと単行本1冊分でも語り切れないほど複 雑かつ興味深いものがあるのですが,ここでは現在の人工知能がとてもではな いが鉄腕アトムのように人間的な水準の「推理」「判断」にいたるシロモノで はない,ということだけ理解しておいてください(決して,研究自体がつまら ないとか価値がない,といっているのではありませんよ。念のため)。 少しテーマが大きく,しかも多岐にわたるものでしたので,このページ,ト ータルとしては難しくぼんやりとした印象が残るかなと少し心配です。ま,こ んなこと,全部すぐにわかる必要もありませんから,のんびり,ご一緒に勉強 していきましょう。